package com.marketsim.analysis;

import com.marketsim.common.bean.BigDecimalElement;
import com.marketsim.utils.BigDecimalUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
 * Created by Alex on 30.03.2014.
 */
public class StatisticCalculator {

    public BigDecimal getMean(List<? extends BigDecimalElement> data) {
        BigDecimal sum = new BigDecimal(0);
        for (BigDecimalElement bigDecimalElement : data)
            sum = sum.add(bigDecimalElement.toBigDecimal());
        return sum.divide(new BigDecimal(data.size()), BigDecimalUtils.SCALE, RoundingMode.HALF_UP);
    }

    public BigDecimal getVariance(List<? extends BigDecimalElement> data) {
        BigDecimal mean = getMean(data);
        BigDecimal temp = new BigDecimal(0);
        for (BigDecimalElement doubleElem : data)
            temp = temp.add(mean.subtract(doubleElem.toBigDecimal()).pow(2));
        return temp.divide(new BigDecimal(data.size()), BigDecimalUtils.SCALE, RoundingMode.HALF_UP);
    }

    public BigDecimal getStdDev(List<? extends BigDecimalElement> data) {
        return new BigDecimal(Math.sqrt(getVariance(data).doubleValue()));
    }

//    public double median(List<? extends BigDecimalElement> data) {
//        double[] b = new double[data.size()];
//        for(int i=0;i<data.size();i++) {
//            b[i] = data.get(i).toBigDecimal();
//        }
//        Arrays.sort(b);
//        if (b.length % 2 == 0) {
//            return (b[(b.length / 2) - 1] + b[b.length / 2]) / 2.0;
//        } else {
//            return b[b.length / 2];
//        }
//    }

//    public double getMean(double[] population) {
//        double sum = 0.0;
//        for (double a : population)
//            sum += a;
//        return sum / population.length;
//    }
//
//    public double getVariance(double[] population) {
//        double mean = getMean(population);
//        double temp = 0;
//        for (double a : population)
//            temp += (mean - a) * (mean - a);
//        return temp / population.length;
//    }
//
//    public double getStdDev(double[] population) {
//        return Math.sqrt(getVariance(population));
//    }
//
//    public double median(double[] population) {
//        double[] b = new double[population.length];
//        System.arraycopy(population, 0, b, 0, b.length);
//        Arrays.sort(b);
//        if (population.length % 2 == 0) {
//            return (b[(b.length / 2) - 1] + b[b.length / 2]) / 2.0;
//        } else {
//            return b[b.length / 2];
//        }
//    }
}
